package com.define.commons.demo;


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 解析xml格式数据
 * @Author: liguocheng
 * @Date: 2018/11/29 14:05
 */
@RunWith(SpringRunner.class)
public class PaseXML {
    @Test
    public void test() throws Exception {
        readXML();
    }
    public static void readXML() throws Exception {
        // 1.获得解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 2.通过工厂获得解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 3.指定要解析的xml文件
        File file = new File("src/book.xml");
        // 4.解析数据：file ----> doc(树形结构)
        Document doc = builder.parse(file);
        // 创建一个列表用来保存book信息
        List<Book> list = new ArrayList<>();
        /*
         * 节点 Node 1 元素节点 Element 2 属性节点 Attr 3 文本节点 Text
         */
        // 通过标签取该xml文件中所有的Book标签，返回一个链表
        NodeList nodeList = doc.getElementsByTagName("book");
        // 解析每一个book元素，并将解析的数据存放到Book对象中
        for (int i = 0; i < nodeList.getLength(); i++) {
            // 从nodeList中获得结点元素
            Element eBook = (Element) nodeList.item(i);
            Attr aIsbn = eBook.getAttributeNode("isbn");
            String isbn = aIsbn.getValue();
            Element eTitle = (Element) eBook.getElementsByTagName("title").item(0);
            String title = eTitle.getTextContent();
            String author = eBook.getElementsByTagName("author").item(0).getFirstChild().getNodeValue();
            String strPrice = eBook.getElementsByTagName("price").item(0).getTextContent();
            int price = Integer.parseInt(strPrice);
            // 将解析的数据存储到Book对象
            Book book = new Book(isbn, title, author, price);
            // 将book对象存放到list列表中
            list.add(book);
            // System.out.println(eTitle.getTextContent());
        }
        // 输出list
        for (Book b : list) {
            System.out.println(b);
        }
    }
}
